package java8;

import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @author lzy
 * Create DateTime: 2018/7/18 14:05
 * @version v1.0
 * 一、Lambda表达式基础语法：Java8中引入了一个新的操作符“->” 该操作符称为箭头操作符或者Lambda操作符
 * <p>
 * 左侧：Lambda表达式的参数列表
 * 右侧：Lambda表达式中所需执行的功能，即Lambda体
 * <p>
 * 语法格式一：无参数，无返回值
 *     () ->  System.out.println("Hello lambda");
 *
 * 语法格式二：有一个参数，并且无返回值
 *     (x) -> System.out.println(x);
 *
 * 语法格式三：若只有一个参数，小括号可以不写
 *     x -> System.out.println(x);
 *
 * 语法格式四：有两个以上参数，有返回值，并且lambda中有多条语句
 *     Comparator<Integer> comparator = (o1, o2) -> {
 *             System.out.println("函数式接口");
 *             if (o1 > o2) {
 *                 return 1;
 *             } else if (o1.equals(o2)) {
 *                 return 0;
 *             } else {
 *                 return -1;
 *             }
 *         };
 *
 * 语法格式五：若lambda体中只有一条语句，return和大括号都可以不写
 *     Comparator<Integer> comparator = (o1, o2) -> Integer.compare(o1,o2);
 *
 * 语法格式六：lambda表达式参数列表的数据类型可以不写，因为JVM编译器通过上下文推断出数据类型，称为类型推断
 *
 * 左右遇一括号省
 * 左侧推断类型省
 *
 * 二、lambda表达式需要"函数式接口"的支持
 * 函数式接口：接口中只有一个抽象方法，称为函数式接口，可以使用注解 @FunctionalInterface，可以检查是否是函数式接口
 *
 */
public class TestLambda2 {
    public static void main(String[] args) {
        // jdk1.7之前，必须是final
        // 从jdk1.8开始，无需指明final，但是其实仍然是final的，在lambda内部无法改变该数据
        int num = 0;

        Runnable rn = () -> System.out.println(Thread.currentThread().getName());

        new Thread(() -> {
            System.out.println("hello lambda");
            System.out.println("num:" + num);
        }).start();

        new Thread(rn).start();

        Consumer<String> con = x -> System.out.println(x);
        con.accept("通过参数进行打印");

        Comparator<Integer> comparator = (o1, o2) -> {
            System.out.println("函数式接口");
            if (o1 > o2) {
                return 1;
            } else if (o1.equals(o2)) {
                return 0;
            } else {
                return -1;
            }
        };

        // 需求对一个数进行运算
        Function<Integer, Integer> function = (x)-> (int) Math.pow(x.doubleValue(), 2);
    }
}
